package dao;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;

import acharOndeMetodoEhChamado.NomeDoMetodoExcecaoTratadorESinalizador;
import acharOndeMetodoEhChamado.SingletonDadosLinhasTabela;

public class DAOPegaExcecoesEhandlers implements InterfaceDAOPegaExcecoesEhandlers {
	
	public static String caminhoTxtComDadoesExcecoes = PegaCaminhoAteTxtExcecoesAtravesDeIProject.getInstance().getCaminhoAteTxtExcecoes();
	
	public NomeDoMetodoExcecaoTratadorESinalizador lerTodoOFluxoDeExcecao(String ultimaLinhaLida)
	{
		
		LinkedList<String> informacoesObtidasNaLinha = this.separarInformacoesObtidasDaLinha(ultimaLinhaLida);
		String excecaoLancada = informacoesObtidasNaLinha.get(1);
		String classeLancaExcecao = informacoesObtidasNaLinha.get(2);
		String metodoLancaExcecao = informacoesObtidasNaLinha.get(3);
		String tipoExcecaoQuandoETratada = informacoesObtidasNaLinha.get(4);
		String classeTrataExcecao = informacoesObtidasNaLinha.get(5);
		String metodoTrataExcecao = informacoesObtidasNaLinha.get(6);
		NomeDoMetodoExcecaoTratadorESinalizador novoDadoSobreLancamentoExcecao = new NomeDoMetodoExcecaoTratadorESinalizador();
		novoDadoSobreLancamentoExcecao.setMetodoTrataExcecao(classeTrataExcecao + "." + metodoTrataExcecao);
		novoDadoSobreLancamentoExcecao.setNomeExcecaoLancada(excecaoLancada);
		novoDadoSobreLancamentoExcecao.setNomeMetodoQueLancaExcecao(classeLancaExcecao + "." + metodoLancaExcecao);
		novoDadoSobreLancamentoExcecao.setTipoExcecaoQuandoElaEhTratada(tipoExcecaoQuandoETratada);
		return novoDadoSobreLancamentoExcecao;
		
	}
	
	public LinkedList<String> separarInformacoesObtidasDaLinha(String linha)
	{
		LinkedList<String> informacoesSeparadas = new LinkedList<String>();
		String stringFormadaPercorreStringLida = "";
		int indicePercorreLinha;
		for(indicePercorreLinha = 0; indicePercorreLinha < linha.length(); indicePercorreLinha++)
		{
			char caracterePercorrido = linha.charAt(indicePercorreLinha);
			String caractereEmString = String.valueOf(caracterePercorrido);
			if(caractereEmString.trim().length() == 0)
			{
				//quebra de linha
				if(stringFormadaPercorreStringLida.length() > 0 && stringFormadaPercorreStringLida.compareTo("null") != 0)
				{
					informacoesSeparadas.add(stringFormadaPercorreStringLida);
					stringFormadaPercorreStringLida = "";
				}
				else if(stringFormadaPercorreStringLida.compareTo("null") == 0)
				{
					stringFormadaPercorreStringLida = "";
				}
			}
			else
			{
				stringFormadaPercorreStringLida = stringFormadaPercorreStringLida + caracterePercorrido;
			}
		}
		//pro final...
		if(stringFormadaPercorreStringLida.length() > 0 && stringFormadaPercorreStringLida.compareTo("null") != 0)
		{
			informacoesSeparadas.add(stringFormadaPercorreStringLida);
		}
		
		return informacoesSeparadas;
	}

	@Override
	public LinkedList<NomeDoMetodoExcecaoTratadorESinalizador> pegarDadosTabelaAPartirDoTxt(
			String assinaturaDoMetodo) 
	{
		try {
			LinkedList<NomeDoMetodoExcecaoTratadorESinalizador> linhasTabela = new LinkedList<NomeDoMetodoExcecaoTratadorESinalizador>();
			File file = new File(caminhoTxtComDadoesExcecoes);
			FileReader fileReader = new FileReader(file);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			String linhaLida = "";
			while(linhaLida != null && linhaLida.contains("# Result of Exception Analysis....") == false)
			{
				linhaLida = bufferedReader.readLine();
			}
			
			if(linhaLida != null  && linhaLida.contains("# Result of Exception Analysis....") == true)
			{
				bufferedReader.readLine();//pega linha em branco
				bufferedReader.readLine(); //outra linha em branco
				linhaLida = bufferedReader.readLine();//linha1 comecou um fluxo  de excecao
				while(linhaLida != null && linhaLida.trim().length() > 0)
				{
					//soh iremos parar de ler fluxos de excecoes quando acharmos uma linha vazia
					NomeDoMetodoExcecaoTratadorESinalizador dadosDaExcecaoLida = this.lerTodoOFluxoDeExcecao(linhaLida);
					
					if(dadosDaExcecaoLida.getNomeMetodoQueLancaExcecao().compareTo(assinaturaDoMetodo) == 0)
					{
						linhasTabela.add(dadosDaExcecaoLida);
					}
					
					linhaLida = bufferedReader.readLine();
				}
				
			}
			
			
			fileReader.close();
			return linhasTabela;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
			return new LinkedList<NomeDoMetodoExcecaoTratadorESinalizador>();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new LinkedList<NomeDoMetodoExcecaoTratadorESinalizador>();
		}
	}
	
	
	@Override
	public LinkedList<NomeDoMetodoExcecaoTratadorESinalizador> pegarDadosTabelaAPartirDoTxt(
			String assinaturaDoMetodo,String excecaoUsuarioEscolheu) 
	{
		try {
			LinkedList<NomeDoMetodoExcecaoTratadorESinalizador> linhasTabela = new LinkedList<NomeDoMetodoExcecaoTratadorESinalizador>();
			File file = new File(caminhoTxtComDadoesExcecoes);
			FileReader fileReader = new FileReader(file);
			BufferedReader bufferedReader = new BufferedReader(fileReader);
			String linhaLida = "";
			while(linhaLida != null && linhaLida.contains("# Result of Exception Analysis....") == false)
			{
				linhaLida = bufferedReader.readLine();
			}
			
			if(linhaLida != null  && linhaLida.contains("# Result of Exception Analysis....") == true)
			{
				bufferedReader.readLine();//pega linha em branco
				bufferedReader.readLine(); //outra linha em branco
				linhaLida = bufferedReader.readLine();//linha1 comecou um fluxo  de excecao
				while(linhaLida != null && linhaLida.trim().length() > 0)
				{
					//soh iremos parar de ler fluxos de excecoes quando acharmos uma linha vazia
					NomeDoMetodoExcecaoTratadorESinalizador dadosDaExcecaoLida = this.lerTodoOFluxoDeExcecao(linhaLida);
					
					if(dadosDaExcecaoLida.getNomeMetodoQueLancaExcecao().compareTo(assinaturaDoMetodo) == 0 
							&& dadosDaExcecaoLida.getNomeExcecaoLancada().compareTo(excecaoUsuarioEscolheu) == 0)
					{
						linhasTabela.add(dadosDaExcecaoLida);
					}
					
					linhaLida = bufferedReader.readLine();
				}
				
			}
			
			
			fileReader.close();
			return linhasTabela;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new LinkedList<NomeDoMetodoExcecaoTratadorESinalizador>();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new LinkedList<NomeDoMetodoExcecaoTratadorESinalizador>();
		}
	}
	

}
